Jump to コンパイラ
コンパイラ
//hello_world.c
#include <stdio.h
void print_hello(){
printf("Hello World?\n");
}
int main(){ int
print_hello();
printf("Hello World!\n");
}
上記のコードはC言語の本の1章でよく見られる Hello World!
を出力する関数である。
C言語というプログラミング言語を使っていて、hello_world.c
というファイルにある文字列がどのように Hello World!
を出力する一つのプログラムになるのか、興味を持ったことがある人はあまりいないと思う。
あるいは、興味を持っていても、簡単に近づきにくいテーマかもしれない。
このコンパイラの章は、コンパイラというテーマを理解することを目的とする。
そして、実際に作成することまで進めることを最終目標とする。
言語?
私たちは プログラミング言語 という言葉をよく使いますが、この 言語 という言葉の正体は何でしょうか?
もちろん、私たちは言語学者ではないので、言語学の視点で言語という言葉を理解する必要はない。
では、次のような定義の中から、私たちエンジニアの好みに合う定義を選んでみましょう。
言語の定義は様々な試みがなされてきた。以下はそのような例の一部である。
1.人々が自分の考えを他の人に表し、伝えるために使用する体系。
2.物、行動、思考、そして状態を表す体系。
3.人々の間で共有される意味の体系。
4.文法的に正しい言葉の集合。
5.言語共同体の中で理解できる言葉の集合。
上記の定義のうち、4番がコンパイラというテーマを理解するための最も適切な定義だと思います。
では、文法的に正しい言葉は何でしょう?
文法
私たちが定義する言語は、一定の文法に従って配列された一定の記号の集合を言語と定義することができます。
では、一定の文法と一定の記号は何だろうか?
実際、C言語を数万コード以上書いた皆さんは、おそらくプログラムを書けと言われたら、本能的に次のように関数を考えることなく書いていると思います。
int main(int argc, char* argv[]){ ...
...
}
もしこの文章をそのまま書いたら、皆さんは自分の母国語と一緒にC言語という言語の話者だと考えてもいいでしょう。
関数を理解してみよう
では、上記の関数を分解してみましょう。C言語を学ぶとき、関数宣言について通常”次のように宣言する”と学びます。
- まず関数のreturn形式を書く
- 関数の名前を書く
- 括弧(
(
)を開きます。 - 関数で使う変数を書きます。
- 変数は '変数のタイプ' '変数名' '
(,)
' の形式で書きます。
- 変数は '変数のタイプ' '変数名' '
- 括弧(
)
)を閉じます。 - 括弧(
{
)を開きます。 - 関数の内容を書く
- 括弧(
}
)を閉じます。
このプロセスが文法通りに言語を使う例であります。
C言語という言語で関数を定義したいなら、上記の文法に合わせて言語を使う必要があります。
まるで、英語(または他の外国語)を習ったときに必死に覚えたto不定詞、動詞の3段変化のようなものと同じと見ることができる。
コンパイラとは、このように文法に合う文字列を解析して関数のような言語の要素に分割し、分割された構成要素に合わせて機械語に変えてくれるツールである!
これから学ぶこと
ここまで述べたことを中心に、これから何を学ぶのか見ていきましょう。
- まず、プログラミングの言語というものがどのように定義されるかを学びましょう。
- 次に、C言語という第3外国語の文法がどのように定義されているか見てみましょう。
- 文法の要素をどのように分割することができるかを見てみましょう。
- 分割した要素をどのように機械語に変えることができるのか見てみましょう。
上記のトピックを理解し、コンパイラを作ってみると、プログラミング言語とコンピュータを見る見方が完全に変わると保証します!!!。
しかし、コンパイラは、それだけ難しく、学ぶべきことも多いテーマです。これから数年かかるかもしれないが、筆者も最後まで書くことができるように努力するつもりです。
単純なコンパイラを作った後は、もう少し様々なテーマであるコンパイラの最適化のような要素を見てみるのも面白いかもしれません。